public static double CalculateLinRc(List<double> x, List<double> y)
{
    int n = x.Count;

    // Basic sums
    double sumx = x.Sum();
    double sumy = y.Sum();
    double sumx2 = x.Select(v => v * v).Sum();
    double sumy2 = y.Select(v => v * v).Sum();
    double sumxy = x.Zip(y, (vx, vy) => vx * vy).Sum();

    // Means
    double xAvg = sumx / n;
    double yAvg = sumy / n;

    // Variance components (sum of squared deviations)
    double sumLstdx = x.Select(v => Math.Pow(v - xAvg, 2)).Sum();
    double sumLstdy = y.Select(v => Math.Pow(v - yAvg, 2)).Sum();

    // Variances
    double sx = sumLstdx / n;
    double sy = sumLstdy / n;

    // Pearson correlation (r)
    double r = (n * sumxy - sumx * sumy) /
               Math.Sqrt((n * sumx2 - sumx * sumx) *
                         (n * sumy2 - sumy * sumy));

    // Lin's Concordance Correlation Coefficient (Rc)
    double linR = r * ((2 * Math.Sqrt(sx) * Math.Sqrt(sy)) /
                       (sx + sy + Math.Pow(xAvg - yAvg, 2)));

    return linR;
}